package menu.menu;

import java.util.Collection;
import java.util.Iterator;

/**
 * Clase que representa una bebida del menú en el tablet y el sistema.
 * @author JSR
 * @version $Id: Bebida.java 62 2010-10-06 16:26:42Z lopezandres2002@hotmail.com $
 */
public class Bebida implements IItem
{
    //---------------------------------------
    // Atributos
    //---------------------------------------

    /**
     * Nombre de la bebida
     */
    private String nombreBebida;
    /**
     * Descripción de la bebida
     */
    private String descripcionBebida;
    /**
     * Lista de ingredientes de la bebida
     */
    private Collection<Ingrediente> listaIngredientes;
    /**
     * Anotaciones extras del plato.<br>
     * Pueden ser formas particulares de interacción con la bebida
     */
    private String anotacionesExtras;
    /**
     * Precio de la bebida sin IVA
     */
    private double precioSinIVA;
    /**
     * Precio de la bebida con IVA
     */
    private double precioConIVA;
    /**
     * Tipos de bebidas que hay, de <code>Constantes.TiposItem</code><br>
     * 3 - Alcohólica
     * 4 - No Alcohólica
     */
    private Constantes.TiposItem tipoDeBebida;
    //---------------------------------------
    // Atributos cuando es un pedido
    //---------------------------------------
    /**
     * Boolean que identifica si la bebida es seleccionado
     * en la bandeja
     */
    private boolean seleccionado;
    /**
     * Deseos sobre la preparación del plato.<br>
     * Por ejemplo: Con mucha pimienta.
     */
    private String deseosPreparacion;
    /**
     * Estado actual del pedido:<br>
     * 0 - SIN_ORDENAR: El estado por default cuando una bebida no ha sido ordenado.<br>
     * 1 - ORDENADO: Se acaba de ordenar de la bebida<br>
     * 2 - EN_PREPARACION: La bebida está siendo preparada<br>
     * 3 - PREPARACION_COMPLETA: La bebida ya ha sido preparada<br>
     * 4 - ENTREGADO: La bebida ha sido entregada a la mesa
     */
    private Constantes.EstadosPedido estadoActualBebida;

    //---------------------------------------
    // Constructor
    //---------------------------------------
    /**
     * Constructor de la clase <code>Bebida</code>
     * @param nombreBebida - El nombre de la bebida
     * @param descripcionBebida - La descripción de la bebida
     * @param listaIngredientes - La lista de ingredientes de la bebida
     * @param anotacionesExtras - Anotaciones extras de interacción con la bebida
     * @param precioSinIVA - El precio de la bebida sin IVA
     * @param precioConIVA - El precio de la bebida con IVA
     * @param tipoDeBebida - El tipo de bebida que es
     */
    public Bebida( String nombreBebida, String descripcionBebida, Collection<Ingrediente> listaIngredientes, String anotacionesExtras, double precioSinIVA, double precioConIVA, Constantes.TiposItem tipoDeBebida )
    {
        this.nombreBebida = nombreBebida;
        this.descripcionBebida = descripcionBebida;
        this.listaIngredientes = listaIngredientes;
        this.anotacionesExtras = anotacionesExtras;
        this.precioSinIVA = precioSinIVA;
        this.precioConIVA = precioConIVA;
        this.tipoDeBebida = tipoDeBebida;
        // Atributos cuando es un pedido
        this.seleccionado = false;
        this.estadoActualBebida = Constantes.EstadosPedido.SIN_ORDENAR;
        this.deseosPreparacion = "";
    }
    //---------------------------------------
    // Getters y Setters
    //---------------------------------------

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getTipoDeItem()
     */
    public Constantes.TiposItem getTipoDeItem()
    {
        return tipoDeBebida;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getDescripcionItem()
     */
    public String getDescripcionItem()
    {
        return descripcionBebida;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getEstadoActualItem() 
     */
    public Constantes.EstadosPedido getEstadoActualItem()
    {
        return estadoActualBebida;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getListaIngredientes()
     */
    public Collection<Ingrediente> getListaIngredientes()
    {
        return listaIngredientes;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getNombreItem()
     */
    public String getNombreItem()
    {
        return nombreBebida;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getPrecioConIVA()
     */
    public double getPrecioConIVA()
    {
        return precioConIVA;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getPrecioSinIVA()
     */
    public double getPrecioSinIVA()
    {
        return precioSinIVA;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#isSeleccionado()
     */
    public boolean isSeleccionado()
    {
        return seleccionado;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getAnotacionesExtra()
     */
    public String getAnotacionesExtra()
    {
        return anotacionesExtras;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#getDeseosPreparacion() 
     */
    public String getDeseosPreparacion()
    {
        return deseosPreparacion;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#setDeseosPreparacion(java.lang.String)
     */
    public void setDeseosPreparacion( String deseosPreparacion )
    {
        this.deseosPreparacion = deseosPreparacion;
    }

    //---------------------------------------
    // Métodos
    //---------------------------------------
    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#adelantarEstadoActualItem()
     */
    public void adelantarEstadoActualItem()
    {
        estadoActualBebida = estadoActualBebida.darSiguienteEstado();
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#cambiarEstadoSeleccionado()
     */
    public void cambiarEstadoSeleccionado()
    {
        seleccionado = seleccionado ? !seleccionado : seleccionado;
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#resetearAtributosDePedido()
     */
    public void resetearAtributosDePedido()
    {
        // Atributos cuando es un pedido
        this.seleccionado = false;
        this.estadoActualBebida = Constantes.EstadosPedido.SIN_ORDENAR;
        this.deseosPreparacion = "";
        // Lo mismo para los ingredientes
        for( Iterator<Ingrediente> it = listaIngredientes.iterator(); it.hasNext(); ) {
            Ingrediente ingrediente = it.next();
            ingrediente.resetearAtributosDePedido();
        }
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#cambiarEstadoSeleccionadoDeIngrediente(java.lang.String) 
     */
    public void cambiarEstadoSeleccionadoDeIngrediente( String nombreIngrediente )
    {
        // Obtiene el iterador
        for( Iterator<Ingrediente> it = listaIngredientes.iterator(); it.hasNext(); ) {
            // Obtiene el ingrediente
            Ingrediente ingrediente = it.next();
            // Si lo encuentra cambia el estado y rompe el recorrido del ciclo
            if( ingrediente.getNombreIngrediente().equals( nombreIngrediente ) ) {
                ingrediente.cambiarEstadoSeleccionado();
                break;
            }
        }
    }

    /**
     * (non-Javadoc)
     * @see menu.menu.IItem#clonarItem()
     */
    public IItem clonarItem()
    {
        return ( IItem )clone();
    }

    //---------------------------------------
    // Métodos Override
    //---------------------------------------
    /**
     * (non-Javadoc)
     * @see Object#clone()
     */
    @Override
    protected Object clone()
    {
        Bebida bebidaClon = new Bebida( this.nombreBebida, this.descripcionBebida, this.listaIngredientes, this.anotacionesExtras, this.precioSinIVA, this.precioConIVA, this.tipoDeBebida );
        return bebidaClon;
    }

    /**
     * (non-Javadoc)
     * @see Object#toString() 
     */
    @Override
    public String toString()
    {
        return nombreBebida.toUpperCase() + "\n" + descripcionBebida;
    }
}
